﻿
using System;
using System.Linq;
using System.Text;
using Spring.Data.Core;
using System.Data;
using System.Collections;
using Spring.Data;
using Spring.Data.Common;
using GestionadorBaseDatos;
using CRUD.InterfaceDAO;
namespace CRUD.DAO
{
    public class ProporcionDao : AdoDaoSupport, IDaoProporcion
    {
        /// <summary>
        /// Strings para las consultas a la bd de la tabla proporcion
        /// </summary>
        #region Querys para metodos
        private string sqlUpdate = @"update proporcion set ganador = @ganador where idEventoProporcion = @idEventoProporcion and idCategoriaProporcion = @idCategoriaProporcion and idParticipanteProporcion = @idParticipanteProporcion";
        private string sqlByIds = "select ganador, idParticipanteProporcion, idCategoriaProporcion, idEventoProporcion, proporcionParticipante, proporcionEmpate  from proporcion where idEventoProporcion = @idEventoProporcion and idParticipanteProporcion = @idParticipanteProporcion and idCategoriaProporcion= @idCategoriaProporcion";
        private string sqlByParticipante = "select ganador, idParticipanteProporcion, idCategoriaProporcion, idEventoProporcion, proporcionParticipante, proporcionEmpate  from proporcion where idParticipanteProporcion = @idParticipanteFk";
        private string sqlByEvento = "select ganador, idParticipanteProporcion, idCategoriaProporcion, idEventoProporcion, proporcionParticipante, proporcionEmpate  from proporcion where idEventoProporcion = @idEventoFk";
        private string SQL = @"select ganador, idParticipanteFk, idCategoriaProporcion, idEventoProporcion from proporcion where idParticipante = @idParticipante";
        private string sql = "select ganador, idParticipanteProporcion, idCategoriaProporcion, idEventoProporcion, proporcionParticipante, proporcionEmpate from proporcion";
        private string sqlInsert = "INSERT INTO proporcion (ganador, idParticipanteProporcion, idCategoriaProporcion, idEventoProporcion, proporcionParticipante, proporcionEmpate ) VALUES (@ganador, @idParticipanteProporcion, @idCategoriaProporcion, @idEventoProporcion, @proporcionParticipante, @proporcionEmpate )";

        # endregion

        # region metodos
        /// <summary>
        /// Obtiene lista de proporciones dada un participante
        /// </summary>
        /// <param name="idParticipante">idparticipante a buscar en la bd</param>
        /// <returns>lista proporcion de un participante</returns>
        public virtual IList GetByParticipante(int idParticipante)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@idParticipanteFk", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = idParticipante;

            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlByParticipante, new ProporcionRowMapper(), dbParameters);

        }

        /// <summary>
        /// Obtiene lista de proporciones dado un evento
        /// </summary>
        /// <param name="idEvento">id del evento a buscar</param>
        /// <returns>lista de proporciones de un evento</returns>
        public virtual IList GetByEvento(int idEvento)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@idEventoFk", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = idEvento;
            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlByEvento, new ProporcionRowMapper(), dbParameters);
        }

        /// <summary>
        /// Obtiene Lista con todas las proporciones
        /// </summary>
        /// <returns>lista de proporciones</returns>
        public virtual IList GetAll()
        {
            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sql, new ProporcionRowMapper());
        }

        /// <summary>
        /// metodo para insertar una nueva proporcion en la bd
        /// </summary>
        /// <param name="crear">Datos de la proporcion a insertar</param>
        public void Insert(Proporcion crear)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@ganador", MySql.Data.MySqlClient.MySqlDbType.String, 2).Value = crear.Ganador;
            dbParameters.Add("@idParticipanteProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.Participante.IdParticipante;
            dbParameters.Add("@idCategoriaProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.Participante.CategoriaFk.IdCategoria;
            dbParameters.Add("@idEventoProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.EventoAsociado.IdEvento;
            dbParameters.Add("@proporcionParticipante", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.ProporcionParticipante;
            dbParameters.Add("@proporcionEmpate", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.ProporcionEmpate;
            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlInsert, dbParameters);
        }

        /// <summary>
        /// Busca proporcion dado un id
        /// </summary>
        /// <param name="crear">contiene id de la proporcion a buscar</param>
        /// <returns>Proporcion con todos sus datos</returns>
        public Proporcion GetByIds(Proporcion crear)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@idParticipanteProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.Participante.IdParticipante;
            dbParameters.Add("@idCategoriaProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.Participante.CategoriaFk.IdCategoria;
            dbParameters.Add("@idEventoProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.EventoAsociado.IdEvento;
            return (Proporcion)AdoTemplate.QueryForObject(CommandType.Text, sqlByIds, new ProporcionRowMapper(), dbParameters);
        }

        /// <summary>
        /// Metodo para updatear una proporcion en la bd
        /// </summary>
        /// <param name="crear">Datos proporcion a updatear</param>
        public void Update(Proporcion crear)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@ganador", MySql.Data.MySqlClient.MySqlDbType.String, 2).Value = crear.Ganador;
            dbParameters.Add("@idParticipanteProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.Participante.IdParticipante;
            dbParameters.Add("@idCategoriaProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.Participante.CategoriaFk.IdCategoria;
            dbParameters.Add("@idEventoProporcion", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.EventoAsociado.IdEvento;
            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlUpdate, dbParameters);
        }

        # endregion
    }
}
